package com.mlh.matrix;

/**
 * @author 缪林辉
 * @date 2024/8/19 20:52
 * @DESCRIPTION
 */
//给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
// 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
public class 旋转图像 {
    //将顺时针旋转90拆解成 矩阵转置+左右对称的两列互换  这种只适合方阵  如果不是方阵就不行
    public void method1(int[][] matrix) {
        int len = matrix.length;
        //矩阵转置（行列互换）
        //代码可以背下来，方便别的算法会使用到
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                matrix[i][j] = matrix[i][j] ^ matrix[j][i];
                matrix[j][i] = matrix[i][j] ^ matrix[j][i];
                matrix[i][j] = matrix[i][j] ^ matrix[j][i];
            }
        }
        // 左右对称的两列互换
        for (int i = 0; i < len / 2; i++) {
            for (int j = 0; j < len; j++) {
                matrix[j][i] = matrix[j][i] ^ matrix[j][len - 1 - i];
                matrix[j][len - 1 - i] = matrix[j][i] ^ matrix[j][len - 1 - i];
                matrix[j][i] = matrix[j][i] ^ matrix[j][len - 1 - i];
            }
        }
    }

    //只要分别以矩阵左上角 1/4 的各元素为起始点执行以上旋转操作，即可完整实现矩阵旋转。
    //不懂去看leetcode 题解

    //暂存tmp=matrix[i][j]
    // matrix[i][j]←matrix[n−1−j][i]←matrix[n−1−i][n−1−j]←matrix[j][n−1−i]←tmp
    public void practice(int[][] matrix) {
        int len=matrix.length;
        for (int i = 0; i < len/2; i++) {
            for (int j = 0; j < (len+1)/2; j++) {
                int temp=matrix[i][j];
                matrix[i][j]=matrix[len-1-j][i];
                matrix[len-1-j][i]=matrix[len-1-i][len-1-j];
                matrix[len-1-i][len-1-j]=matrix[j][len-1-i];
                matrix[j][len-1-i]=temp;
            }
        }
    }
    
}
